/*
 *================================================================================
 *	Plik: f_swap.c
 *	Created on: Jun 5, 2011
 *--------------------------------------------------------------------------------
 *	Autorzy: Piotr Zdunek, Mateusz Słowikowski, Krzysztof Wiąckowski
 *	Projekt: Model mikrokontrolera AVR
 *	Kompilator: avr-gcc-4.3.5
 *	Doc: doxygen 1.4.3
 *--------------------------------------------------------------------------------
 *	Zawiera:
 *--------------------------------------------------------------------------------
 *	Komentarze:
 *================================================================================
 */

/*! \file f_swap.c
 * \brief Plik opisujący funkcję SWAP
 */

#include "types.h"
#include "mem_abs.h"
//********************************************************************************
//SWAP - funkcja zamieniająca pierwsze cztery bity z ostatnimi czterema bitami w danym rejestrze
//********************************************************************************


void F_SWAP(void) {

#ifndef  DEBUG_MODE_VOICE
	printf("Function SWAP.");
#endif


	/*!  void F_SWAP(void){}
	 *  \n \n
	 *  SWAP - funkcja zamieniająca ze sobą miejscami
	 *  4 pierwsze i cztery ostatnie bity w rejestrze
	 *
	 *  \ref pageswap \n
	 */



	uint8_t Rd = ((getMEMC(getPC()) & 0x0FF0) >> 4) & 0b00011111; 	//identyfikacja numeru rejestru arg. 1
	uint8_t RdH = (getRegister(Rd) & 0b11110000) >> 4; 				//identyfikacja numeru rejestru arg. 2
	uint8_t RdL = getRegister(Rd) & 0b00001111;
	uint8_t Rd_temp;

	Rd_temp = RdH;
	RdH = RdL;
	RdL = Rd_temp;
	uint8_t Rd_val = RdH << 4 + RdL;

	setRegister(Rd, Rd_val);
	incPC();
}

/*! \page pageswap Opis działania funkcji SWAP
 *
 *	SWAP - funkcja zamieniająca pierwsze cztery bity z ostatnimi czterema bitami w danym rejestrze.
 *
 *	\dontinclude f_swap.c
 *
 *	\section sec_swap1 Operacje rejestrowe oraz arytmetyczno-logiczne
 *	1. Identyfikacja numeru rejestru argumentu:
 *	\skipline getMEMC
 *	2. Pobranie czterech starszych bitów:
 *	\skipline RdH
 *	3. Pobranie czterech młodszych bitów:
 *	\skipline RdL
 *	4. Stworzenie pośredniego rejestru dla RdH:
 *	\skipline Rd_temp
 *	\until RdH
 *	5. Przepisanie RdL w miejsce RdH:
 *	\skipline RdH
 *	6. Przepisanie RdH w miejsce RdL przy pomocy rejestru pośredniego Rd_temp:
 *	\skipline Rd_temp
 *	7.Utworzenie przestawionego rejestru RD
 *	\skipline Rd_val
 *	8.Zapisanie zmienionego rejestru
 *	\skipline setRegister
 *
 *	\section sec_and3 Kod źródłowy funkcji
 *
 *	\include f_swap.c
 *
 */
